package org.yinxianren.java.test.thread;

import java.util.Date;
import java.util.concurrent.TimeUnit;

/**
 * 在某些情况下，我们需要等待线程的终结。例如，我们可能会遇到程序在执行前需要初始化资源。在执行剩下的代码之前，我们需要等待线程完成初始化任务。
 * 为达此目的, 我们使用Thread 类的join() 方法。当前线程调用某个线程的这个方法时，它会暂停当前线程，直到被调用线程执行完成。
 */
public class DataSourcesLoader implements Runnable {
    public void run() {
        System.out.printf( " Beginning data sources loading: %s\n",new Date());
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf( "Data sources loading has finished:%s\n",new Date());
    }
}

/**
 * Java 提供2种形式的 join() 方法:
 *
 * join (long milliseconds)
 * join (long milliseconds, long nanos)
 * 第一种join() 方法, 这方法让调用线程等待特定的毫秒数。例如，如果thread1对象使用代码thread2.join(1000), 那么线程 thread1暂停运行，直到以下其中一个条件发生：
 *
 * thread2 结束运行
 * 1000 毫秒过去了
 * 当其中一个条件为真时，join() 方法返回。
 *
 * 第二个版本的 join() 方法和第一个很像，只不过它接收一个毫秒数和一个纳秒数作为参数。
 */
class MainFive{
    public static void main(String[] args) {
        DataSourcesLoader dsLoader = new DataSourcesLoader();
        Thread thread1 = new Thread(dsLoader,"DataSourceThread");
        thread1.start();
        try {
            thread1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.printf("Main: Configuration has been loaded: %s\n",new Date());
    }
}